package com.study.studyelasticsearch.client;

import cn.hutool.core.util.StrUtil;
import org.elasticsearch.ResourceAlreadyExistsException;
import org.elasticsearch.index.IndexNotFoundException;

import java.util.Collection;

/**
 * ES对索引操作的相关接口
 * @author 吴宇亮 on 2022/5/17 18:00
 */
public interface EsIndex {

    final class Config {
        /** 索引分词器 **/
        public static String ANALYZER_TYPE = "index.analysis.analyzer.default.type";
        /** 分片树 **/
        public static String NUMBER_OF_SHARDS = "index.number_of_shards";
        /** 副本数 **/
        public static String NUMBER_OF_REPLICAS = "index.number_of_replicas";
    }

    /**
     * es的索引名必须要小写，否则新增的时候会报invalid_index_name_exception <br/>
     * 所以将索引名转成下划线风格
     * @param indexName 索引名
     * @return 将索引转换成小写
     */
    static String handleIndexName(String indexName){
        return StrUtil.toUnderlineCase(indexName);
    }

    /**
     * @return 查询所有索引的索引名
     */
    String[] listIndexs();

    /**
     * @param indexName 根据indexName查询
     * @param isExact 是否要根据indexName精确查询
     * @return 查询所有索引的索引名
     */
    String[] listIndexs(String indexName, boolean isExact);

    /**
     * @param indexName 根据indexName模糊查询
     * @return 查询所有索引的索引名，根据indexName模糊查询
     */
    String[] listIndexs(String indexName);

    /**
     * @param indexName 索引名
     * @param isExact 是否要根据indexName精确查询
     * @return indexName是否存在
     */
    boolean indexExist(String indexName, boolean isExact);

    /**
     * @param indexName 根据indexName模糊查询
     * @return indexName是否存在
     */
    boolean indexExist(String indexName);

    /**
     * 创建索引，默认使用ik_max_word中文分词器
     * @param indexName 索引名
     * @return 是否成功创建索引
     * @throws ResourceAlreadyExistsException 索引已存在
     */
    boolean createIndex(String indexName) throws ResourceAlreadyExistsException;

    /**
     * 常见索引
     * @param indexName 索引名
     * @param analyzer 索引的默认分词器
     * @return
     */
    boolean createIndex(String indexName, EsAnalyzer.Analyzer analyzer);

    /**
     * 删除索引
     * @param indexNames 索引名，允许使用通配符*
     * @return 是否删除成功
     * @throws IndexNotFoundException 索引不存在
     */
    boolean deleteIndex(Collection<String> indexNames);

    /**
     * 删除索引
     * @param indexNames 索引名，允许使用通配符*
     * @return 是否删除成功
     * @throws IndexNotFoundException 索引不存在
     */
    boolean deleteIndex(String... indexNames) throws IndexNotFoundException;

    /**
     * 如果index存在才删除
     * @param indexNames 要删除的index
     * @return 是否删除成功
     */
    boolean deleteIndexIfExist(String... indexNames);
}
